package com.gimi.cloud.bbp.common.utils;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.net.URLDecoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

/**
 * 系统通用工具类
 * @author wbj
 * @date 2018-01-18
 * @version 1.0
 */
public class CommonUtil {
	/**
	 * 判断指定对象是否为空（null或空字符串）
	 * @param obj 带判断的对象
	 * @return 判断结果
	 */
	public static boolean isEmpty(Object obj){
		if(null == obj || "".equals(obj.toString())){
			return true;
		}
		return false;
	}
	/**
	 * 生成随机编码
	 * 
	 * @param length 生成编码的长度
	 * @return 生成结果
	 */
	public static String randomCode(int length) {// 传入的字符串的长度
		StringBuilder builder = new StringBuilder(length);
		for (int i = 0; i < length; i++) {

			int r = (int) (Math.random() * 3);
			int rn1 = (int) (48 + Math.random() * 10);
			int rn2 = (int) (65 + Math.random() * 26);
			int rn3 = (int) (97 + Math.random() * 26);

			switch (r) {
			case 0:
				builder.append((char) rn1);
				break;
			case 1:
				builder.append((char) rn2);
				break;
			case 2:
				builder.append((char) rn3);
				break;
			}
		}
		return builder.toString().toUpperCase();
	}
	
	/**
	 * 格式化金额数字
	 * @param money 待格式化的金额
	 * @param split 金额分隔符
	 * @return 格式化后的结果
	 */
	public static String toMoney(Object money,String split){
		if(null == money){
			return null;
		}
		String result = "";
		String text = money.toString();
		String rail = "";
		String fh = "";
		if(text.indexOf("-")>=0){
			fh = text.substring(0,text.indexOf("-")+1);
			text = text.substring(text.indexOf("-")+1);
		}
		if(text.indexOf(".")>=0){
			rail = text.substring(text.indexOf("."));
			text = text.substring(0,text.indexOf("."));
			for(int i=text.length()-1,j=0;i>=0;i--,j++){
				if(j!=0&&j%3==0){
					result = text.charAt(i)+split+result;
				}else{
					result = text.charAt(i)+result;
				}
			}
		}else{
			for(int i=text.length()-1,j=0;i>=0;i--,j++){
				if(j!=0&&j%3==0){
					result = text.charAt(i)+split+result;
				}else{
					result = text.charAt(i)+result;
				}
			}
		}
		return fh+result+rail;
	}
	
	/**
	 * 格式化日期
	 * @param date 待格式化的日期
	 * @param formate 格式化字符串
	 * @return 格式化后的日期字符串
	 */
	public static String toDate(Object date,String formate){
		if(isEmpty(date)){
			return "";
		}
		String result = date.toString();
		try{
			if(isEmpty(formate)){
				formate = "yyyy-MM-dd";
			}
			DateFormat df = new SimpleDateFormat(formate);
			return df.format(df.parse(result));
		}catch(Exception e){
			return result;
		}
	}

	/**
	 * 格式化时间字符串为时间
	 * @param dateStr 待格式化的时间字符串
	 * @param format 格式化类型，默认为 yyyy-MM-dd
	 * @return 格式化结果
	 */
	public static Date stringToDate(String dateStr, String format) {
		if(isEmpty(dateStr)){
			return null;
		}
		try{
			if(isEmpty(format)){
				format = "yyyy-MM-dd";
			}
			DateFormat df = new SimpleDateFormat(format);
			return df.parse(dateStr);
		}catch(Exception e){
			return null;
		}
	}
	/**
	 * 判断指定路径是否是图片路径
	 * 	后缀是否为在 png|PNG|GIF|gif|jpg|JPG|pdf|PDF  中
	 * @param imgUrl 图片路径
	 * @return 判断结果
	 */
	public static boolean checkImg(String imgUrl) {
		if(StringUtils.isNotBlank(imgUrl)) {
			String reg="(png|PNG|GIF|gif|jpg|JPG|pdf|PDF)";
			String[] url = null;
			if(imgUrl.indexOf(".") != -1) {
				url = imgUrl.split("\\.");
				if(url[url.length-1].matches(reg)) {
					return true;
				}
			}
		}
		return false;
	}

	/**
	 * 过滤特殊字符
	 * @param str 待过滤的字符串
	 * @return 过滤后的字符串
	 */
	public static String checkParams(String str) {
		if(!StringUtil.isBlank(str)){
			str = str.replaceAll("[\\s`~!@#$%^&*()+=|{}\"\':;,\\[\\].<>/?~！@#￥%……&*（）【】‘；：”“’。，、？]", "");
		}
		return str;
	}

	/**
	 * 初始化请求头信息至请求body
	 * @param request
	 * @param requestData 请求body参数
	 * @param headerKeys 待初始化的请求头部信息
	 * @param  headerMaps 初始化body中的key与header的key不一致的数据
	 * @param  cover 是否覆盖
	 * @return
	 */
	public static String initHeaderInfoToBody(HttpServletRequest request,String requestData,String[] headerKeys,Map<String,String> headerMaps,boolean cover){
		if(JsonUtil.isJSON(requestData)){
			JSONObject requeustJson = JsonUtil.jsonToJSONObject(requestData);
			for(String headerKey:headerKeys){
				String headerValue = request.getHeader(headerKey);
				if(StringUtil.isNotBlank(headerValue)){
					//覆盖
					if(cover){
						requeustJson.put(headerKey,headerValue);
					}else{ //非覆盖
						if(!requeustJson.containsKey(headerKey)){
							requeustJson.put(headerKey,headerValue);
						}
					}
				}
			}
			for(String key:headerMaps.keySet()){
				String value = request.getHeader(headerMaps.get(key));
				if(StringUtil.isNotBlank(value)){
					//覆盖
					if(cover){
						requeustJson.put(key,value);
					}else{ //非覆盖
						if(!requeustJson.containsKey(key)){
							requeustJson.put(key,value);
						}
					}
				}
			}
			if(StringUtil.isNotBlank(requeustJson.getString("uname"))){
				try{
					requeustJson.put("uname", URLDecoder.decode(requeustJson.getString("uname"),"utf-8"));
				}catch(Exception e){
					e.printStackTrace();
				}
			}
			requestData = requeustJson.toJSONString();
		}
		return requestData;
	}
}
